package team.api;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;

import study.itwill.common.DBHandler;
import team.item.b_video_saveItem;

/**
 * CRUD 처리를 하는 클래스 만들기
 * ----------------------------------------------------------
 * -------------------- 데이터 입출력이 필요한 기능에 대하여, CREATE, READ, UPDATE, DELETE에 해당하는
 * 메소드를 구현해 놓는 처리를 말한다.
 * ----------------------------------------------------------
 * -------------------- CREATE --> SQL의 INSERT 구문을 실행한다. READ --> SQL의 SELECT
 * 구문을 실행한다. UPDATE --> SQL의 UPDATE 구문을 실행한다. DELETE --> SQL의 DELETE 구문을 실행한다.
 * -- --------------------------------------------------------------------------
 * -- CRUD에 해당하는 기능들은 어떤 데이터 처리를 목적으로 하는지가 정해져야한다
 * 
 * ex) 학생 데이터의 입출력 교수 데이터의 입출력 회원 데이터의 입출력 게시물 데이터의 입출력 카테고리 데이터의 입출력 상품 데이터의
 * 입출력
 * --------------------------------------------------------------------------
 * ---- 메소드들의 이름은 "동사" + "목적어" 형식으로 작성한다 ex) 학생 데이터의 입출력인 경우 -->
 * insertboard_save_reply, updateboard_save_reply, deleteboard_save_reply,
 * selectboard_save_reply
 * --------------------------------------------------------
 * ---------------------- insert 기능의 경우, 각 데이터를 판별할 수 있는 고유한 값(PK)를 제외하고 INSERT에
 * 처리한 모든 값들을 메소드 파라미터로 전달받아야한다 데이터 형은 테이블 구조를 참조하면 된다
 * 
 * 메소드의 수행 결과는 새롭게 추가된 데이터의 일련번호(seq)를 리턴해 주어야 한다
 * --------------------------------
 * ---------------------------------------------- update, delete의 경우 결과를 리턴해 주어야
 * 한다 --> boolean 값을 리턴한다.
 * 
 * UPDATE, DELETE는 각 데이터를 판별할 수 있는 고유한 값(PK)를 파라미터로 전달 받는다 그 외에 추가적으로 일괄 삭제나, 일괄
 * 수정등을 목적으로 할 경우 상황에 따라 파라미터 형태를 변경할 수 있다.
 * --------------------------------------
 * ---------------------------------------- 이 클래스들은 DATABASE 접속이 성공 한 이후에 호출된다고
 * 가정되어야 한다.
 */

public class b_video_save {

	static Logger logger = Logger.getLogger(b_video_save.class);

	private static final String TABLE = "b_video_save";

	public int insertb_video_save(String video_src, String title,
			String content, int board_seq, int member_seq) {
		// ---------------------------------------------
		// 메소드 시작
		// ---------------------------------------------
		logger.debug("=================== method start >> insertb_video_save");

		logger.debug("[PARAMS] video_src = " + video_src);
		logger.debug("[PARAMS] title = " + title);
		logger.debug("[PARAMS] content = " + content);
		logger.debug("[PARAMS] board_seq = " + board_seq);
		logger.debug("[PARAMS] member_seq = " + member_seq);
		int seq = 0;
		// SQL 인젝션 방어
		video_src = video_src.replace("'", "\'");
		title = title.replace("'", "\'");
		content = content.replace("'", "\'");

		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();

		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO b_video_save("
				+ "video_src, title, content, reg_date, edit_date, board_seq,member_seq"
				+ ") VALUES (" + "%d, '%s', '%s','%s', now(),now(), %d,%d);";

		boolean result = DBHandler.execSql(sql, video_src, title, content,
				board_seq, member_seq);

		// -----------------------------------------------------------------
		// 결과처리
		// -----------------------------------------------------------------

		if (result) {
			DBHandler.commit();
			seq = DBHandler.getMax(TABLE, "seq", null);
			logger.debug("처리결과 >> " + seq + "번 댓글 등록 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 추가 실패");
		}

		logger.debug("===================== method end >> insertb_video_save");

		return seq;

	}

	public boolean updateb_video_save(int seq, String video_src, String title,
			String content, int board_seq, int member_seq) {

		logger.debug("=================== method start >> insertb_video_save");

		logger.debug("[PARAMS] seq = " + seq);
		logger.debug("[PARAMS] video_src = " + video_src);
		logger.debug("[PARAMS] title = " + title);
		logger.debug("[PARAMS] content = " + content);
		logger.debug("[PARAMS] board_seq = " + board_seq);
		logger.debug("[PARAMS] member_seq = " + member_seq);

		// 리턴할 값 선언
		boolean result = false;

		// SQL 인젝션 방어
		video_src = video_src.replace("'", "\'");
		title = title.replace("'", "\'");
		content = content.replace("'", "\'");

		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();

		String sql = "UPDATE b_video_save SET "
				+ "video_src='%s', title='%s', content='%s',edit_date=now(), board_seq=%d ,member_seq=%d"
				+ "WHERE seq = %d";

		result = DBHandler.execSql(sql, video_src, content, board_seq,
				member_seq, seq);

		// ---------------------------------------------
		// 결과처리
		// ---------------------------------------------

		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 게시판 수정 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 삭제 실패");
		}

		logger.debug("=========== method end >> updateb_video_save");

		return result;
	}

	public boolean deleteb_video_save(int seq) {
		logger.debug("=========== method start >> deleteb_video_save");
		logger.debug("[PARAMS] seq=" + seq);

		boolean result = false;

		DBHandler.beginTrans();

		String sql = "DELETE FROM b_video_save WHERE seq=%d";
		result = DBHandler.execSql(sql, seq);

		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 삭제 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 삭제 실패");
		}

		logger.debug("=========== method end >> deleteb_video_save");
		return result;
	}

	/**
	 * 학생 한명의 데이터를 조회하여 리턴하는 메소드
	 * 
	 * @param seq
	 * @return boardItem
	 */

	public b_video_saveItem selectb_video_save(int seq) {
		logger.debug("======================== method start >> selectb_video_save");
		logger.debug("[PARAMS] seq = " + seq);

		b_video_saveItem item = null;

		// 데이터조회 int seq;

		String sql = "SELECT seq , video_src , title ,content, reg_date ,edit_date,b_good,b_hit board_seq , member_seq"
				+ "From b_video_save " + "WHERE seq = %d";

		ResultSet rs = DBHandler.getResult(sql);

		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();

				// 1) ResultSet의 모든 데이터를 변수로 추출

				int se = rs.getInt(1);
				String video_src = rs.getString(2);
				String title = rs.getString(3);
				String content = rs.getString(4);
				String reg_date = rs.getString(5);
				String edit_date = rs.getString(6);
				int b_good = rs.getInt(7);
				int b_hit = rs.getInt(8);
				int board_seq = rs.getInt(9);
				int member_seq = rs.getInt(10);

				// 2) 추출된 값을 객체로 구성
				item = new b_video_saveItem(se, video_src, title, content,
						reg_date, edit_date, board_seq, b_good, b_hit,
						member_seq);

			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}

		}

		if (item == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}

		logger.debug("================== method end >> selectb_video_save");

		return item;
	}

	/**
	 * 학생목록의 데이터를 조회하여 리턴하는 메소드
	 * 
	 * @param stduno
	 * @return ArrayList<boardItem>
	 */

	public ArrayList<b_video_saveItem> selectb_video_saveList(int seq) {
		logger.debug("================== method start >> selectb_video_save");

		ArrayList<b_video_saveItem> list = null;

		// 데이터 조회

		String sql = "SELECT seq , video_src , title , content , reg_date ,edit_date,board_seq "
				+ "From b_video_save ";

		// 파라미터에 따라서 검색조건 지정

		if (seq > 0) {
			sql += " WHERE seq='" + seq + "'";
		}

		ResultSet rs = DBHandler.getResult(sql);

		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<b_video_saveItem>();

				while (rs.next()) {

					// 1) ResultSet의 모든 데이터를 변수로 추출

					int se = rs.getInt(1);
					String video_src = rs.getString(2);
					String title = rs.getString(3);
					String content = rs.getString(4);
					String reg_date = rs.getString(5);
					String edit_date = rs.getString(6);
					int b_good = rs.getInt(7);
					int b_hit = rs.getInt(8);
					int board_seq = rs.getInt(9);
					int member_seq = rs.getInt(10);

					// 2) 추출된 값을 객체로 구성
					b_video_saveItem item = new b_video_saveItem(se, video_src,
							title, content, reg_date, edit_date, board_seq,
							b_good, b_hit, member_seq);
					// 3) ArrayList에 추가
					list.add(item);

				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}

		if (list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}

		logger.debug("================== method end >> selectboard");

		return list;

	}

	/**
	 * 
	 * @param board_name
	 * @return
	 */

	public int b_good_reg(String board_name) {

		// ---------------------------------------------
		// 메소드 시작
		// ---------------------------------------------
		logger.debug("=================== method start >> insertboard");

		logger.debug("[PARAMS] board_name = " + board_name);
		int seq = 0;
		// SQL 인젝션 방어
		board_name = board_name.replace("'", "\'");

		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();

		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO b_video_save("
				+ "board_name,reg_date,edit_date,b_good,b_hit" + ") VALUES ("
				+ "'%s', now(), now(), 0 , 0);";

		boolean result = DBHandler.execSql(sql, board_name);

		// -----------------------------------------------------------------
		// 결과처리
		// -----------------------------------------------------------------

		if (result) {
			DBHandler.commit();
			seq = DBHandler.getMax(TABLE, "seq", null);
			logger.debug("처리결과 >> " + seq + "번 게시판 등록 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 추가 실패");
		}

		logger.debug("===================== method end >> insertboard");

		return seq;

	}

	/**
	 * 
	 * @param seq
	 * @return
	 */
	public boolean b_good_esc(int seq) {

		logger.debug("======================== method start >> deleteseq");
		logger.debug("[PARAMS] seq = " + seq);

		boolean result = false;

		DBHandler.beginTrans();

		String sql = "DELETE FROM board WHERE seq = %d";
		result = DBHandler.execSql(sql, seq);

		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 좋아요 삭제 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 좋아요 삭제 실패");
		}

		logger.debug("============================ method end >> deleteseq");

		return result;
	}

	/**
	 * 
	 * @param board_name
	 * @return
	 */
	public int b_count(String board_name) {

		// ---------------------------------------------
		// 메소드 시작
		// ---------------------------------------------
		logger.debug("=================== method start >> insertboard");

		logger.debug("[PARAMS] board_name = " + board_name);

		// SQL 인젝션 방어
		board_name = board_name.replace("'", "\'");

		// ---------------------------------------------------------------
		// 로직 구현
		// ---------------------------------------------------------------
		// 테이블이 자동 증가가 아니므로,
		// 최대값 + 1 형식으로 메소드 안에서 생성한다
		int seq = DBHandler.getMax(TABLE, "seq", null);

		logger.debug("자동 생성된 게시판 번호 : " + seq);

		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();

		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO b_video_save("
				+ "board_name,reg_date,edit_date,b_good,b_hit" + ") VALUES ("
				+ "'%s', auto(), auto(), 0 , 0);";

		boolean result = DBHandler.execSql(sql, board_name);

		// -----------------------------------------------------------------
		// 결과처리
		// -----------------------------------------------------------------

		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 게시판 등록 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 추가 실패");
		}

		logger.debug("===================== method end >> insertboard");

		return seq;

	}

	/**
	 * 
	 * @param board_name
	 * @return
	 */
	public int text_write(String board_name) {

		// ---------------------------------------------
		// 메소드 시작
		// ---------------------------------------------
		logger.debug("=================== method start >> insertboard");

		logger.debug("[PARAMS] board_name = " + board_name);

		// SQL 인젝션 방어
		board_name = board_name.replace("'", "\'");

		int seq = 0;
		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();

		// INSERT 처리를 위한 구현t_d
		String sql = "INSERT INTO b_video_save(" + "board_name,reg_date,ediate"
				+ ") VALUES (" + "'%s', now(), '%s');";

		boolean result = DBHandler.execSql(sql, board_name);

		// -----------------------------------------------------------------
		// 결과처리
		// -----------------------------------------------------------------

		if (result) {
			DBHandler.commit();
			seq = DBHandler.getMax(TABLE, "seq", null);
			logger.debug("처리결과 >> " + seq + "번 게시판 등록 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 추가 실패");
		}

		logger.debug("===================== method end >> insertboard");

		return seq;

	}

	/**
	 * 
	 * @param seq
	 * @param board_name
	 * @return
	 */

	public boolean text_update(int seq, String board_name) {

		logger.debug("=================== method start >> updateboard");

		logger.debug("[PARAMS] seq = " + seq);
		logger.debug("[PARAMS] board_name = " + board_name);

		// 리턴할 값 선언
		boolean result = false;

		// SQL 인젝션 방어
		board_name = board_name.replace("'", "\'");

		// 트렌젝션에 대한 판단이 잘 서지 않는다면,
		// 무조건 하면 된다.
		DBHandler.beginTrans();

		String sql = "UPDATE board "
				+ "set board_name = '%s' , edit_date = now() "
				+ "WHERE seq = %d;";

		result = DBHandler.execSql(sql, board_name, seq);

		// ---------------------------------------------
		// 결과처리
		// ---------------------------------------------

		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 게시판 수정 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 삭제 실패");
		}

		logger.debug("=========== method end >> updateboard");

		return result;
	}

	public boolean text_delete(int seq) {

		logger.debug("======================== method start >> deleteseq");
		logger.debug("[PARAMS] seq = " + seq);

		boolean result = false;

		DBHandler.beginTrans();

		String sql = "DELETE FROM b_video_save WHERE seq = %d";
		result = DBHandler.execSql(sql, seq);

		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 게시판 삭제 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 삭제 실패");
		}

		logger.debug("============================ method end >> deleteseq");

		return result;
	}

	public ArrayList<b_video_saveItem> b_search(int seq) {

		logger.debug("================== method start >> selectb_search");

		ArrayList<b_video_saveItem> list = null;

		// 데이터 조회

		String sql = "SELECT seq , board_name , reg_date , edit_date "
				+ "From board ";

		// 파라미터에 따라서 검색조건 지정

		if (seq > 0) {
			sql += " WHERE seq='" + seq + "'";
		}

		ResultSet rs = DBHandler.getResult(sql);

		if (rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<b_video_saveItem>();

				while (rs.next()) {

					// 1) ResultSet의 모든 데이터를 변수로 추출

					int se = rs.getInt(1);
					String video_src = rs.getString(2);
					String title = rs.getString(3);
					String content = rs.getString(4);
					String reg_date = rs.getString(5);
					String edit_date = rs.getString(6);
					int board_seq = rs.getInt(7);
					int b_good = rs.getInt(8);
					int b_hit = rs.getInt(9);
					int member_seq = rs.getInt(10);

					// 2) 추출된 값을 객체로 구성
					b_video_saveItem item = new b_video_saveItem(se, video_src,
							title, content, reg_date, edit_date, board_seq,
							b_good, b_hit, member_seq);

					// 3) ArrayList에 추가
					list.add(item);

				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {
				}
				rs = null;
			}
		}

		if (list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}

		logger.debug("================== method end >> selectb_search");

		return list;

	}

}
